package cn.tedu.charging_order.service.impl;

import cn.tedu.charging_order.pojo.param.OrderAddParam;
import cn.tedu.charging_order.service.OrderService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.Random;

@Slf4j
@Service
public class OrderServiceImpl implements OrderService {
    @Override
    public String createOrder(OrderAddParam orderAddParam) {
        log.debug("创建订单:{}",orderAddParam);
        //1.生成订单号
        log.debug("创建订单-生成订单号");
        String orderNo = getOrderNo();
        log.debug("创建订单-生成订单号:{}",orderNo);
        return orderNo;
    }

    /**
     * 生成订单号
     * 唯一性
     *  1 UUID 随机并且唯一
     *  2 自增的数据库主键  递增 不重复 唯一  分库分表下不能保证唯一 会重复
     *
     * 全局唯一性：不能出现重复的ID号，既然是唯一标识，这是最基本的要求。
     * 趋势递增：在MySQL InnoDB引擎中使用的是聚集索引，由于多数RDBMS使用B-tree的数据结构来存储索引数据，在主键的选择上面我们应该尽量使用有序的主键保证写入性能。
     * 单调递增：保证下一个ID一定大于上一个ID，例如事务版本号、IM增量消息、排序等特殊需求。
     * 信息安全：如果ID是连续的，恶意用户的扒取工作就非常容易做了，直接按照顺序下载指定URL即可；如果是订单号就更危险了，竞对可以直接知道我们一天的单量。所以在一些应用场景下，会需要ID无规则、不规则。
     *
     * 分布式id生成器 分布式场景下 生成唯一的id
     * 雪花算法  https://www.jianshu.com/p/1af94260664a  twitter的snowflake算法  (分布式id生成器)
     * 美团leaf https://tech.meituan.com/2017/04/21/mt-leaf.html
     *
     *
     * MVP 业务刚刚开始 先自己生成
     *
     *  100000 + 随机数  + 时间戳
     * @return
     */
    private String getOrderNo(){
        //1.前缀
        String start = "1000000";
        Random random = new Random();
        //1.生成10000 之间的随机数
        int r = random.nextInt(10000);
        //3.时间戳
        long now = System.currentTimeMillis();
        return  start + "_" + r + "_" + now;
    }
}
